package com.example.springai.controller;

import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import com.example.springai.entity.History;
import com.example.springai.service.HistoryService;
import jakarta.annotation.Resource;
import org.springframework.ai.chat.client.ChatClient;
import org.springframework.ai.chat.messages.AssistantMessage;
import org.springframework.ai.chat.messages.Message;
import org.springframework.ai.chat.messages.UserMessage;
import org.springframework.ai.chat.model.ChatResponse;
import org.springframework.ai.chat.prompt.Prompt;

import org.springframework.ai.deepseek.DeepSeekChatModel;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import reactor.core.publisher.Flux;

import java.time.LocalDateTime;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;

@RestController
public class ChatController {
    private static String characters="你是我的AI助理小红，说话风格简单直接，善于用最精炼的语言解决问题";

    private final DeepSeekChatModel chatModel;

    @Resource
    //通过 Spring 注入的（来自 AIConfig 的配置：当需要 ChatClient 实例时，用这个方法创建并管理它）
    private ChatClient chatClient;
    @Resource
    private HistoryService historyService;

    @Autowired
    public ChatController(DeepSeekChatModel chatModel) {
        this.chatModel = chatModel;
    }

    @GetMapping("/ai/generate")
    public Map generate(@RequestParam(value = "message", defaultValue = "Tell me a joke") String message) {
        return Map.of("generation", chatModel.call(message));
    }
    /*//防止中文乱码
    @GetMapping(value = "/ai/generateStream0", produces = "text/html;charset=UTF-8")
    public Flux<String> generateStream(@RequestParam(value = "message", defaultValue = "Tell me a joke") String message) {
        var prompt = new Prompt(new UserMessage(message));
        //输出文字而不是流，原来返回的是Flux<String>
        return chatModel.stream(prompt).map(chatResponse -> chatResponse.getResult().getOutput().getText());
    }*/

    @GetMapping(value = "/ai/generateStream", produces = "text/html;charset=UTF-8")
    public Flux<String> generateStream(@RequestParam(value = "message", defaultValue = "Tell me a joke") String message
    ,@RequestParam(value = "sessionId", defaultValue = "1") Long sessionId) {
        StringBuilder[] builder={new StringBuilder()};
        //将用户发送的消息封装成 History 实体，存入数据库
        History userhistory = new History();
        userhistory.setDatetime(LocalDateTime.now());
        userhistory.setRole("user");
        userhistory.setContent(message);
        userhistory.setSessionId(sessionId);
        //save()即sql中的insert
        historyService.save(userhistory);

        //查询本对话所有历史聊天记录（所以加ne排除当前条对话）
        List<History> histories=historyService.list(
                //等效于SELECT * FROM history WHERE session_id = ?
                new QueryWrapper<History>().eq("sessionId",sessionId).ne("id",userhistory.getId())
        );
        //转换历史记录为 AI 模型识别的 Message 格式（分为用户message和AImessage）
        List<Message> messages=histories.stream().map(history ->
                history.getRole().equals("user")?new UserMessage(history.getContent()):new AssistantMessage(history.getContent())).collect(Collectors.toList());

        //调用 AI 模型，传入上下文和新消息，获取流式响应
        Flux<String> stream=chatClient.prompt(characters).user(message).messages(messages).stream().content();

        //实时返回 AI 生成的内容，并在生成完成后保存 AI 响应到数据库
        return stream
                // 累加 AI 生成的内容（用于最终保存完整响应）
                .doOnNext(s -> builder[0].append(s))
                // 当 AI 生成完成后，保存 AI 的响应到数据库
                .doOnComplete(() -> {
                    History aihistory = new History();
                    // 以下代码存在错误，修正说明见下方
                    aihistory.setSessionId(sessionId); // 关联当前会话
                    aihistory.setContent(builder[0].toString()); // AI 生成的完整内容
                    aihistory.setRole("assistant"); // 角色为"AI助手"
                    aihistory.setDatetime(LocalDateTime.now()); // 记录时间
                    historyService.save(aihistory); // 保存 AI 响应
                });
    }

    @GetMapping(value = "/ai/generate2", produces = "text/html;charset=UTF-8")
    public String generation(String message) {
        return this.chatClient.prompt(characters)
                .user(message)
                .call() //调用请求
                .content(); //大模型返回chatresponse，需要提取出string
    }
}